/**
 * \file CMyMainWindow.h
 * \author Corentin Le Bail
 * \date 2009-2011
 * \brief Fichier de déclaration de la classe CMyMainWindow; fenêtre de base.
 */
//------------------------------------------------------------------------------
#ifndef __CMYMAINWINDOW_H__
#define __CMYMAINWINDOW_H__
//------------------------------------------------------------------------------
#include <QMainWindow>
#include <QSqlQuery>
#include <QToolBar>
#include <QToolButton>
#include <QMenu>
#include <QUrl>
#include <QMdiSubWindow>
#include "CDAOManager.h"
#include "CGlobal.h"
#include "CDAOManager.h"
#include "CPrintFrm.h"
//------------------------------------------------------------------------------
/**
 * \class CMyMainWindow CMyMainWindow.h "CMyMainWindow.h"
 * \brief Classe abstraite de la fenêtre de base
 */
class CMyMainWindow : public QMainWindow {
	Q_OBJECT
	public:
		/**
		 * \fn CMyMainWindow(QString name, QWidget *parent=0)
		 * \brief Constructeur
		 * \param[in] name Nom de l'objet
		 * \param[in] mdiSubWindow Référence vers un object QMdiSubWindow de la fenêtre
		 * \param[in] parent Référence vers un objet parent
		 */
		CMyMainWindow(QString name, QWidget *parent=0);
		/**
		 * \fn virtual ~CMyMainWindow(void)
		 * \brief Destructeur
		 */
		virtual ~CMyMainWindow(void);
		/**
		 * \fn void setMdiSubWindow(QMdiSubWindow *mdiSubWindow)
		 * \brief Affecte l'éventuelle référence à la mdiSubWindow
		 * \param[in] mdiSubWindow Référence vers la mdiSubWindow
		 */
		void setMdiSubWindow(QMdiSubWindow *mdiSubWindow) { this->mdiSubWindow=mdiSubWindow; }
		/**
		 * \fn QMdiSubWindow * getMdiSubWindow(void)
		 * \return La référence vers la mdiSubWindow
		 */
		QMdiSubWindow * getMdiSubWindow(void) { return mdiSubWindow; }
	protected:
		QString masterTable; //!< Nom de la table maître
		QString primaryKey; //!< Nom de la clé primaire
		QString curCode; //!< Valeur de la clé primaire courante
		QMap<QString, QVariant> keyValues; //!< Valeur courante des clés
		QToolButton *btnPrint; //!< Bouton pour l'impression
		/**
		 * \fn virtual void makeRequete(QString &requete, QString &alias)
		 * \brief Méthode virtuelle permettant la création de la requete de sélection des informations
		 * \brief sans La condition ni l'ordre de tri
		 * \param[out] requete Requete
		 * \param[out] alias Alias de table pour la condition
		 */
		virtual void makeRequete(QString &requete, QString &alias) { requete="SELECT * FROM "+masterTable; };
		/**
		 * \deprecated Utiliser les objets CDAO...
		 * \fn virtual void setActionCur(CGlobal::EAction action) = 0
		 * \brief Méthode virtuelle pure permettant la sélection d'une nouvelle action
		 * \param[in] action Nouvelle action
		 */
		virtual void setActionCur(CGlobal::EAction action) = 0;
		/**
		 * \deprecated Utiliser les objets CDAO...
		 * \fn virtual void showFormulaire(QSqlQuery *query, CGlobal::EAction& action)
		 * \brief Méthode virtuelle permettant l'affichage du formulaire
		 * \param[in] query Résultat de la requête
		 * \param[out] action Action au retour de la fonction
		 */
		virtual void showFormulaire(QSqlQuery *query, CGlobal::EAction& action);
		/**
		 * \fn virtual void showFormulaire(CGlobal::EAction& action)
		 * \brief Méthode virtuelle permettant l'affichage du formulaire
		 * \param[out] action Action au retour de la fonction
		 */
		virtual void showFormulaire(CGlobal::EAction& action) {}
		/**
		 * \deprecated Utiliser les objets CDAO...
		 * \fn bool chargeDonnees(QString quelCode, CGlobal::ESens sens)
		 * \brief Charge les données de la page
		 * \param[in] quelCode Clé primaire de la fiche à afficher 
		 * \param[in] sens Sens de déplacement dans les fiches
		 * \return True en cas de succès, false sinon
		 */
		bool chargeDonnees(QString quelCode, CGlobal::ESens sens);
		/**
		* \fn bool chargeDonnees(CGlobal::ESens sens=CGlobal::seNone, bool reload=true)
		 * \brief Charge les données de la page
		 * \param[in] sens Sens de déplacement dans les fiches
		 * \param[in] reload Indique si l'on doit recharger les données
		 * \return True en cas de succès, false sinon
		*/
		bool chargeDonnees(CGlobal::ESens sens=CGlobal::seNone, bool reload=true);
		/**
		 * \fn clearChamps(void)
		 * \brief Efface tous les champs de la fenêtre.
		 */
		void clearChamps(void);
		/**
		 * \fn initChamps(void)
		 * \brief Affecte la valeur par défaut des champs de la fenêtre.
		 */
		void initChamps(void);
		/**
		 * \fn enableChamps(bool enable)
		 * \brief Rend les champs de la fenêtre Enabled/Disabled.
		 * \param[in] enable Enabled/Disabled
		 */
		void enableChamps(bool enable);
		/**
		 * \fn validChamps(void)
		 * \brief Vérifi la validité des champs de la fenêtre.
		 * \return True si les champs sont valides, false sinon
		*/
		bool validChamps(void);
		/**
		 * \fn void loadSchema(void)
		 * \brief Affecte le bon format aux champs de la fenêtre.
		 */
		void loadSchema(void);
		/**
		 * \fn bool validLiaison(void)
		 * \brief Vérifi la validité des liaison de la fenêtre.
		 * \return True si la validité est respecté, false sinon
		 */
		bool validLiaison(void);
		/**
		 * \fn void calculChamps(CGlobal::EAction action)
		 * \brief Exécute les formules des champs calculés.
		 * \param[in] action Action courante
		 */
		void calculChamps(CGlobal::EAction action);
		/**
		 * \fn void enableBtnPrint(bool enable)
		 * \brief Enable / disable l'éventuel bouton print.
		 * \param[in] enable Enable / disable
		 */
		void enableBtnPrint(bool enable);
		/**
		 * \fn virtual CDAO * getDao(void)
		 * \return La référence de l'objet DAO correspondant à la fiche
		 */
		virtual CDAO * getDao(void) { return 0; }
		/**
		 * \fn void loadPrintPopupMenu(void)
		 * \return Charge la liste des éditions
		 */
		void loadPrintPopupMenu(QToolBar *toolBar);
		/**
		 * \fn void print(CDAODocToPrintEx *docToPrint)
		 * \brief Appel le webservice d'impression du document docToPrint
		 */
		void print(CDAODocToPrintEx *docToPrint);
	private:
		QMenu *printPopMenu;
		QList<CDAODocToPrintEx *> * listDocToPrint;
		QMdiSubWindow * mdiSubWindow;
		
		QAction * createPrintAction(CDAODocToPrintEx *docToPrint, bool multi);
	signals:
		/**
		 * \fn quit(QString frmName, QString value)
		 * \brief Signal émit lorsque la fenêtre se ferme
		 * \param[in] frmName Nom d'objet
		 * \param[in] value Valeur clé de la fenêtre
		 */
		void quit(QString frmName, QString value);
		/**
		 * \fn quit(QString frmName, QMap<QString, QVariant> keyValues)
		 * \brief Signal émit lorsque la fenêtre se ferme
		 * \param[in] frmName Nom d'objet
		 * \param[in] keyValues Valeur des clés de la fenêtre
		 */
		void quit(QString frmName, QMap<QString, QVariant> keyValues);
	protected slots:
		/**
		 * \fn void onPrint(bool checked=false)
		 * \brief Slot d'impression
		 */
		void onPrint(bool checked=false);
	private slots:
		void on_actPremiereFiche_triggered(void); /** \todo Suprrimer l'appel aux méthodes deprecated */
		void on_actFichePrecedente_triggered(void); /** \todo Suprrimer l'appel aux méthodes deprecated */
		void on_actFicheSuivante_triggered(void); /** \todo Suprrimer l'appel aux méthodes deprecated */
		void on_actDerniereFiche_triggered(void); /** \todo Suprrimer l'appel aux méthodes deprecated */
};
//------------------------------------------------------------------------------
#endif //__CMYMAINWINDOW_H__
//------------------------------------------------------------------------------
